`
https://leetcode.cn/problems/the-two-sneaky-numbers-of-digitville/
`

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var getSneakyNumbers = function (nums) {
  const n = nums.length - 2
  // nums 里的数字全部异或一遍
  let x = nums.reduce((acc, cur) => acc ^ cur)
  // 再跟 0...n-1 的数异或一遍
  for (let i = 0; i < n; i++) x ^= i
  // 此时的 x 就是答案两个数字的异或
  // 拿到 x 最低为 1 的位，表示两个答案在这一位上不同
  const lowBit = x & -x
  // 将 nums 分为两组，lowBit 位为 1 为一组，为 0 为另一组
  // 将这两组分别异或，此时答案异或了两次，其他数异或了一次
  let x1 = 0, x2 = 0
  for (const num of nums) {
    if (num & lowBit) {
      x1 ^= num
    } else {
      x2 ^= num
    }
  }
  // 再将这两组跟分为两组的（相同分组方法） 0...n-1 的数异或一遍
  // 此时答案异或了三次，其他数异或了两次
  // 根据异或性质，就成功将两个答案分离出来了
  for (let i = 0; i < n; i++) {
    if (i & lowBit) {
      x1 ^= i
    } else {
      x2 ^= i
    }
  }
  return [x1, x2]
};